'''
元组：
    1.元组是一种不可变的序列类型，一旦创建，就不能修改。
    2.元组的语法：(元素1,元素2,元素3,...)
    3.元组的元素可以是任意类型，包括数字、字符串、列表、元组、字典、集合、函数、类、对象等。
元组的常用函数方法：
    1.len(tuple)：返回元组元素个数。
    2.max(tuple)：返回元组中元素最大值。
    3.min(tuple)：返回元组中元素最小值。
    4.tuple(seq)：将列表转换为元组。
    5.list(tuple)：将元组转换为列表。
    6.tuple1 + tuple2：连接两个元组。
    7.tuple * n：复制元组n次。
    8.tuple[index]：返回元组中指定下标元素。
    9.tuple[index1:index2]：返回元组中指定范围内的元素。（切片）
    10.index(value)：返回元组中指定元素的下标。
    11.count(value)：返回元组中指定元素出现的次数。
    12.in：判断元素是否存在于元组中。
    13.not in：判断元素是否不存在于元组中。
    14.tuple1 == tuple2：判断两个元组是否相等。
    15.tuple1 != tuple2：判断两个元组是否不相等。
    16.tuple1 < tuple2：判断元组是否小于另一个元组。
    17.tuple1 > tuple2：判断元组是否大于另一个元组。
    18.tuple1 <= tuple2：判断元组是否小于等于另一个元组。
    19.tuple1 >= tuple2：判断元组是否大于等于另一个元组。
    20.tuple1[index] = value：修改元组中指定下标元素的值。
    21.del tuple[index]：删除元组中指定下标元素。
    22.tuple1[index1:index2] = tuple2：修改元组中指定范围内的元素。
    23.del tuple[index1:index2]：删除元组中指定范围内的元素。
    24.tuple1 = tuple2：将元组赋值给另一个元组。
    25.tuple1 = tuple2, tuple3, tuple4, ...：将多个元组赋值给一个元组。
元组之间的比较：
    1.元组之间的比较是按照元素的顺序进行比较的。
    2.如果两个元组的第一个元素相等，则比较第二个元素，以此类推。
    3.如果两个元组的第一个元素不相等，则比较第一个元素。
    比如：(1,2,3) < (1,2,4)，返回True。
    比如：(1,2,3) > (1,2,2)，返回True。
    比如：(1,2,3) == (1,2,3)，返回True。    
    
'''
#1.定义元组
tuple1=(1,2,3,4,5,6,7,8,9) # 定义一个元组，里面包含1到9的数字
print(tuple1,type(tuple1)) # 输出元组，类型是tuple

#2.取值,配合[下标]  
print(tuple1[0]) # 输出第一个元素，下标从0开始
print(tuple1[1]) # 输出第二个元素
print(tuple1[2]) # 输出第三个元素
print(tuple1[3]) # 输出第四个元素
print(tuple1[4]) # 输出第五个元素
print(tuple1[5]) # 输出第六个元素
print(tuple1[6]) # 输出第七个元素
print(tuple1[7]) # 输出第八个元素
print(tuple1[8]) # 输出第九个元素
# print(tuple1[9]) # 报错，下标超出范围，元组只有9个元素，下标从0开始，到8结束

#3.遍历
for i in tuple1: # 遍历元组，i是元组中的每一个元素，i的类型是int
    print(i) # 输出i的值，i的类型是int
print("="*50) # 输出分隔符，分隔符是50个等号

#4.使用下标的方式遍历
for i in range(len(tuple1)): # 遍历元组，i是元组中的每一个元素的下标，i的类型是int
    print(tuple1[i]) # 输出i的值，i的类型是int
print("="*50) # 输出分隔符，分隔符是50个等号

#元组的特点和作用：自动组包和拆包
#1.自动组包：当函数返回多个值时，会自动将这些值封装成一个元组。
t1=(10,20,30)
print(type(t1))

t2="aa","bb","cc" # 自动组包，将"aa","bb","cc"封装成一个元组，元组的名称是t2
print(t2,type(t2)) # 输出元组，类型是tuple
#2.拆包：当函数返回一个元组时，可以将这个元组中的值分别赋值给多个变量。
#2.1 自动的把t1里面的前三个元素拿出来，赋值给a,b,c
a,b,c=t1 # 自动拆包，将t1中的前三个元素分别赋值给a,b,c
print(a,b,c,end="\t") # 输出a,b,c的值，a的值是10，b的值是20，c的值是30，end="\t"表示输出后不换行，而是输出一个制表符 end=“\n"的话表示输出后换行
print()


b1,b2,b3=t2 # 自动拆包，将t2中的前三个元素分别赋值给b1,b2,b3
print(b1,b2,b3,end="\t") # 输出b1,b2,b3的值，b1的值是"aa"，b2的值是"bb"，b3的值是"cc"
print()

#3.组包和拆包在函数返回多个值时的应用
def fun1(): # 定义一个函数，用来获取学生的信息，返回值是一个元组，包含学生的姓名、年龄、性别、成绩
    return 10,"aa","bb"
a1,a2,a3=fun1() # 调用函数，返回的是一个元组，这个元组包含了多个值，这个元组的名称是result
print(a1,a2,a3,end="\t") # 输出元组，这个元组包含了多个值，这个元组的名称是result

#元组可以让列表不可修改
lst=[10,20,30]
#将列表转换成元组
t3=tuple(lst) # 将列表转换成元组，元组的名称是t3
print(t3,type(t3)) # 输出元组，类型是tuple
#元组的元素不能修改，但是可以修改列表的元素
lst[0]=100 # 修改列表的第一个元素的值为100
print(lst) # 输出列表，类型是list
#t3[0]=100 # 报错，元组的元素不能修改，但是可以修改列表的元素
print(t3,type(t3)) # 输出元组，类型是tuple